From: Florian Müllner Date: Fri, 29 Jan 2021 19:33:23 +0000 (+0100) Subject: windowManager: Allow switching workspaces with super-scroll X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~616^2^2~473 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=7aa36ad239cc4ad138629a4bac1df974388bca5c;p=gnome-shell.git windowManager: Allow switching workspaces with super-scroll So far, we couldn't allow workspace scrolling outside the overview because scroll events were always sent to clients. However mutter was changed recently to pass on scroll events when the mouse button modifier (usually super) is pressed, which allows us to enable the same workspace scrolling as in the overview now. Part-of: --- diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js index f4176dae6..f113fed38 100644 --- a/js/ui/windowManager.js +++ b/js/ui/windowManager.js @@ -862,6 +862,16 @@ var WindowManager = class { Shell.ActionMode.OVERVIEW, this._switchToApplication.bind(this)); + global.stage.connect('scroll-event', (stage, event) => { + if (this._workspaceAnimation.canHandleScrollEvent(event)) + return Clutter.EVENT_PROPAGATE; + + if ((event.get_state() & global.display.compositor_modifiers) === 0) + return Clutter.EVENT_PROPAGATE; + + return this.handleWorkspaceScroll(event); + }); + global.display.connect('show-resize-popup', this._showResizePopup.bind(this)); global.display.connect('show-pad-osd', this._showPadOsd.bind(this)); global.display.connect('show-osd', (display, monitorIndex, iconName, label) => { diff --git a/js/ui/workspaceAnimation.js b/js/ui/workspaceAnimation.js index 856da8f49..6cac580e7 100644 --- a/js/ui/workspaceAnimation.js +++ b/js/ui/workspaceAnimation.js @@ -284,11 +284,15 @@ var WorkspaceAnimationController = class { }); const swipeTracker = new SwipeTracker.SwipeTracker(global.stage, - Shell.ActionMode.NORMAL, { allowDrag: false, allowScroll: false }); + Shell.ActionMode.NORMAL, { allowDrag: false }); swipeTracker.connect('begin', this._switchWorkspaceBegin.bind(this)); swipeTracker.connect('update', this._switchWorkspaceUpdate.bind(this)); swipeTracker.connect('end', this._switchWorkspaceEnd.bind(this)); this._swipeTracker = swipeTracker; + + global.display.bind_property('compositor-modifiers', + this._swipeTracker, 'scroll-modifiers', + GObject.BindingFlags.SYNC_CREATE); } _prepareWorkspaceSwitch(workspaceIndices) { @@ -390,6 +394,10 @@ var WorkspaceAnimationController = class { } } + canHandleScrollEvent(event) { + return this._swipeTracker.canHandleScrollEvent(event); + } + _findMonitorGroup(monitorIndex) { return this._switchData.monitors.find(m => m.index === monitorIndex); }